package edu.ues21.tcs.ecommerce2011.mvc.service.impl;

import java.sql.Date;
import java.sql.Time;
import java.util.ArrayList;
import java.util.List;


import edu.ues21.tcs.ecommerce2011.mvc.dao.ArticuloDAO;
import edu.ues21.tcs.ecommerce2011.mvc.dao.ArticuloPrecioDAO;
import edu.ues21.tcs.ecommerce2011.mvc.dao.CarritoDAO;
import edu.ues21.tcs.ecommerce2011.mvc.dao.ClienteDAO;
import edu.ues21.tcs.ecommerce2011.mvc.dao.DetalleCarritoDAO;
import edu.ues21.tcs.ecommerce2011.mvc.dao.DetallePedidoDAO;
import edu.ues21.tcs.ecommerce2011.mvc.dao.EstadoDAO;
import edu.ues21.tcs.ecommerce2011.mvc.dao.FormaPagoDAO;
import edu.ues21.tcs.ecommerce2011.mvc.dao.ListaPrecioDAO;
import edu.ues21.tcs.ecommerce2011.mvc.dao.PedidoDAO;
import edu.ues21.tcs.ecommerce2011.mvc.model.Articulo;
import edu.ues21.tcs.ecommerce2011.mvc.model.ArticuloPrecio;
import edu.ues21.tcs.ecommerce2011.mvc.model.DetallePedido;
import edu.ues21.tcs.ecommerce2011.mvc.model.Estado;
import edu.ues21.tcs.ecommerce2011.mvc.model.FormaPago;
import edu.ues21.tcs.ecommerce2011.mvc.model.ListaPrecio;
import edu.ues21.tcs.ecommerce2011.mvc.model.Pedido;
import edu.ues21.tcs.ecommerce2011.mvc.model.Usuario;
import edu.ues21.tcs.ecommerce2011.mvc.service.CarritoService;

public class CarritoServiceImpl implements CarritoService {

    private ArticuloDAO adao;
    private ListaPrecioDAO lpdao;
    private ArticuloPrecioDAO apdao;
    private PedidoDAO pdao;
    private DetallePedidoDAO dpdao;
    private EstadoDAO edao;
    private FormaPagoDAO fpdao;
    private ClienteDAO cldao;
    private CarritoDAO cdao;
    private DetalleCarritoDAO dcdao;

    @Override
    public void agregarCarrito(Integer artId, Integer cant, Integer userId) {

        Articulo articulo = adao.getArticulo(artId);
        ListaPrecio lis = lpdao.getListaPrecioHoy();
        ArticuloPrecio ap = apdao.getArticuloPrecio(articulo.getIdarticulo(), lis.getIdListaPrecio());
        Integer dni = userId;


        DetallePedido dp = new DetallePedido();
        dp.setCantidad(cant);
        dp.setArticulo(ap);

        Integer idCarrito = cdao.existeCarrito(dni);
        if (idCarrito == 0) {
            //No HAY, Crea un nuevo carrito.
            cdao.setCarrito(dni);
        }
        idCarrito = cdao.existeCarrito(dni);
        dcdao.setDetalleCarrito(idCarrito, cant, artId);


    }

    @Override
    public List<DetallePedido> getCarrito(Integer userId) {
        Integer idCarrito = cdao.existeCarrito(userId);
        if (idCarrito != 0) {
            //SI HAY, trae detallecarrito
            return dcdao.getDetalleCarrito(cdao.existeCarrito(userId));
        }
        return null;
    }

    @Override
    public void quitarCarrito(Integer artId, Integer userId) {
        dcdao.quitarDetalleCarrito(cdao.existeCarrito(userId), artId);
    }

    @Override
    public void limpiarCarrito(Integer userId) {
        dcdao.deleteDetalleCarrito(cdao.existeCarrito(userId));
        cdao.deleteCarrito(userId);

    }

    @Override
    public void cerrarCarrito(Usuario user, Integer formaPago) {
        Integer userId = user.getDni();
        Estado estado = edao.getEstado(1);
        FormaPago fp = fpdao.getFormaPago(formaPago);
        Integer idCarrito = cdao.existeCarrito(userId);
        List<DetallePedido> detallepedidos = new ArrayList<DetallePedido>();



        if (idCarrito != 0) {
            //SI HAY carrito creado, me fijo si tiene detalle
            detallepedidos = dcdao.getDetalleCarrito(idCarrito);
            if (!detallepedidos.isEmpty()) {
                //Si tiene articulos, paso todo a pedidos
                Pedido pedido = new Pedido();
                pedido.setCliente(cldao.getCliente(user.getCliente().getCuit()));
                pedido.setEstado(estado);
                pedido.setFormaPago(fp);

                long lnMilisegundos = new java.util.Date().getTime();//fecha actual
                pedido.setFecha(new Date(lnMilisegundos));
                pedido.setHora(new Time(lnMilisegundos));
                pdao.save(pedido);

                pedido = pdao.getUltimoPedido(pedido.getCliente().getCuit());

                for (DetallePedido dp : detallepedidos) {
                    dp.setPedido(pedido);
                    dpdao.save(dp);
                }

                //Y borro
                limpiarCarrito(userId);
            }
        }

    }

    public void setAdao(ArticuloDAO adao) {
        this.adao = adao;
    }

    public void setApdao(ArticuloPrecioDAO apdao) {
        this.apdao = apdao;
    }

    public void setCdao(CarritoDAO cdao) {
        this.cdao = cdao;
    }

    public void setCldao(ClienteDAO cldao) {
        this.cldao = cldao;
    }

    public void setDcdao(DetalleCarritoDAO dcdao) {
        this.dcdao = dcdao;
    }

    public void setDpdao(DetallePedidoDAO dpdao) {
        this.dpdao = dpdao;
    }

    public void setEdao(EstadoDAO edao) {
        this.edao = edao;
    }

    public void setFpdao(FormaPagoDAO fpdao) {
        this.fpdao = fpdao;
    }

    public void setLpdao(ListaPrecioDAO lpdao) {
        this.lpdao = lpdao;
    }

    public void setPdao(PedidoDAO pdao) {
        this.pdao = pdao;
    }

}
